#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from jsonpath import findall

from autoapi.common.env_handler import write_env_vars
from autoapi.common.errors import JsonPathFindError, VariableError
from autoapi.common.variable_cache import variable_cache
from autoapi.common.yaml_handler import write_yaml_vars
from autoapi.core.path_conf import autoapi_path
from autoapi.enums.var_type import VarType


def record_variables(
    jsonpath: str, target: dict, key: str, set_type: str, env: str
) -> None:
    """
    记录变量

    :param jsonpath:
    :param set_type:
    :param target:
    :param key:
    :param env:
    :return:
    """
    # 智能jsonpath处理：如果原始jsonpath失败，尝试其他可能的表达式
    value = None
    jsonpath_attempts = [jsonpath]
    
    # 如果jsonpath包含[*]，尝试替换为其他可能的表达式
    if '[*]' in jsonpath:
        # 尝试去掉[*]的表达式（用于单个对象）
        single_path = jsonpath.replace('[*]', '')
        jsonpath_attempts.append(single_path)
        
        # 尝试使用[0]的表达式（用于数组的第一个元素）
        first_element_path = jsonpath.replace('[*]', '[0]')
        jsonpath_attempts.append(first_element_path)
    
    # 尝试不同的jsonpath表达式
    for attempt_path in jsonpath_attempts:
        try:
            value = findall(attempt_path, target)
            if value:
                break
        except Exception:
            continue
    
    if not value:
        raise JsonPathFindError(f"jsonpath 取值失败, 表达式: {jsonpath}，尝试了: {jsonpath_attempts}")
    
    # 处理多个值的情况
    if len(value) == 1:
        # 单个值，直接存储
        value_str = str(value[0])
    else:
        # 多个值，存储为列表
        value_str = str(value)
    
    if set_type == VarType.CACHE:
        variable_cache.set(key, value_str)
    elif set_type == VarType.ENV:
        write_env_vars(autoapi_path.run_env_dir, env, key, value_str)
    elif set_type == VarType.GLOBAL:
        write_yaml_vars({key: value_str})
    else:
        raise VariableError(
            f'变量设置失败, 用例参数 "type: {set_type}" 值错误, 请使用 cache / env / global'
        )
